package com.fulu.javabase.classloadprocess;

/**
 * 子类的初始化<clinit>:
 * 1.静态变量和静态代码块按顺序执行
 *   j = method();
 *   static 静态代码块
 *
 * 先初始化父类： 4 1
 * 再初始化子类： 9 6
 *
 * 实例初始化过程<init>
 * 1.父类的实例化过程 也就是 super() 10 3 2
 * 2.子类的非静态变量和非静态代码块顺序执行
 *   i = test()  10
 *   非静态代码块 8
 * 3.子类构造器（最后） 7
 *
 * 因为创建了两个Son，实例初始化的过程<init>执行了两遍
 * 10 3 2 10 8 7
 * */
public class Son extends Father{
    // 非静态变量
    private int i = test();
    // 静态变量
    private static int j = method();

    // 静态代码块
    static {
        System.out.println("6子类静态代码块");
    }

    // 构造器
    Son(){
//        super(); // 写或不写，都会在子类的构造器第一行，一定会调用父类的构造器
        System.out.println("7子类构造器");
    }

    // 费静态代码块
    {
        System.out.println("8子类非静态代码块");
    }

    public static int method() {
        System.out.println("9子类静态变量");
        return 0;
    }

    public int test() {
        System.out.println("10子类非静态变量");
        return 1;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
        // 第二次不执行类初始化，只执行实例化过程
        Son s2 = new Son();
    }
}
